package com.crm.common.result;

import lombok.Data;

import java.util.List;

/**
 * 通用返回结果类
 * 支持data为单个对象或对象数组
 *
 * @param <T> 数据类型
 */
@Data
public class ResultDate<T> {
    /**
     * 消息提示
     */
    private String msg;

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 返回数据，可以是单个对象或对象数组
     */
    private T data;

    /**
     * 私有构造方法
     */
    private ResultDate() {
    }

    /**
     * 成功响应 - 单个对象
     * @param data 返回数据
     * @param <T> 数据类型
     * @return ResultData实例
     */
    public static <T> ResultDate<T> success(T data) {
        ResultDate<T> result = new ResultDate<>();
        result.setCode(200);
        result.setMsg("操作成功");
        result.setData(data);
        return result;
    }

    /**
     * 成功响应 - 单个对象（自定义消息）
     * @param msg 自定义消息
     * @param data 返回数据
     * @param <T> 数据类型
     * @return ResultData实例
     */
    public static <T> ResultDate<T> success(String msg, T data) {
        ResultDate<T> result = new ResultDate<>();
        result.setCode(200);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /**
     * 成功响应 - 对象数组
     * @param data 对象数组
     * @param <T> 数据类型
     * @return ResultData实例
     */
    public static <T> ResultDate<List<T>> success(List<T> data) {
        ResultDate<List<T>> result = new ResultDate<>();
        result.setCode(200);
        result.setMsg("操作成功");
        result.setData(data);
        return result;
    }

    /**
     * 成功响应 - 对象数组（自定义消息）
     * @param msg 自定义消息
     * @param data 对象数组
     * @param <T> 数据类型
     * @return ResultData实例
     */
    public static <T> ResultDate<List<T>> success(String msg, List<T> data) {
        ResultDate<List<T>> result = new ResultDate<>();
        result.setCode(200);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /**
     * 成功响应 - 无数据
     * @return ResultData实例
     */
    public static ResultDate<Void> success() {
        ResultDate<Void> result = new ResultDate<>();
        result.setCode(200);
        result.setMsg("操作成功");
        return result;
    }

    /**
     * 成功响应 - 仅消息（无数据）
     * @param msg 自定义消息
     * @return ResultData实例
     */
    public static ResultDate<Void> success(String msg) {
        ResultDate<Void> result = new ResultDate<>();
        result.setCode(200);
        result.setMsg(msg);
        return result;
    }

    /**
     * 错误响应
     * @param msg 错误消息
     * @return ResultData实例
     */
    public static ResultDate<Void> error(String msg) {
        ResultDate<Void> result = new ResultDate<>();
        result.setCode(500);
        result.setMsg(msg);
        return result;
    }

    /**
     * 错误响应 - 带状态码
     * @param code 状态码
     * @param msg 错误消息
     * @return ResultData实例
     */
    public static ResultDate<Void> error(Integer code, String msg) {
        ResultDate<Void> result = new ResultDate<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    /**
     * 自定义响应
     * @param code 状态码
     * @param msg 消息
     * @param data 数据
     * @param <T> 数据类型
     * @return ResultData实例
     */
    public static <T> ResultDate<T> of(Integer code, String msg, T data) {
        ResultDate<T> result = new ResultDate<>();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /**
     * 判断是否成功
     * @return 是否成功
     */
    public boolean isSuccess() {
        return code != null && code == 200;
    }
}
